// Kony

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "Base_GameModeBase.generated.h"

class ULoadScreenSaveGame;
class USaveGame;
class UMVVM_LoadSlot;
class UCharacterClassInfo;
class UAbilityInfo;
/**
 * 游戏模式
 */
UCLASS()
class GASC_HUANLING_API ABase_GameModeBase : public AGameModeBase
{
	GENERATED_BODY()
public:
	//角色、怪物 职业信息
	UPROPERTY(EditDefaultsOnly, Category = "Character Class")
	TObjectPtr<UCharacterClassInfo> CharacterClassInfo;
	//能力信息 包含能力的类型、输入标签、等级要求、状态标签、是否显示冷却 等
	UPROPERTY(EditDefaultsOnly, Category = "Ability Info")
	TObjectPtr<UAbilityInfo> AbilityInfo;

	/* 保存游戏部分，未来可以考虑移植到独立的类中 */
	//保存游戏槽位数据函数
	UFUNCTION()
	void SaveSlotGame(UMVVM_LoadSlot* LoadSlot,int32 SlotIndex);
	//获取加载游戏槽位数据函数
	ULoadScreenSaveGame* GetSaveSlotData(const FString& SlotName, int32 SlotIndex) const;
	//删除存档槽位函数
	static void DeleteSaveSlot(const FString& SlotName, int32 SlotIndex);
	//获取当前游戏保存数据
	ULoadScreenSaveGame* RetrieveInGameSaveData();
	//保存游戏进度数据函数
	void SaveInGameProgressData(ULoadScreenSaveGame* SaveObject);
	//保存游戏世界状态 DestinationMapAssetName 为目标地图资产名称 - 用于保存跳转的地图
	void SaveWorldState(UWorld* World, const FString& DestinationMapAssetName = FString("")) const;
	//加载游戏世界状态
	void LoadWorldState(UWorld* World)const;
	//蓝图设置保存游戏的蓝图类
	UPROPERTY(EditDefaultsOnly)
	TSubclassOf<USaveGame> LoadScreenSaveGameClass;

	//跳转地图 传入加载槽视图模型
	UFUNCTION(BlueprintCallable)
	void TravelToMap(UMVVM_LoadSlot* LoadSlot);
	//默认地图名称
	UPROPERTY(EditDefaultsOnly)
	FString DefaultMapName;
	//默认地图
	UPROPERTY(EditDefaultsOnly)
	TSoftObjectPtr<UWorld> DefaultMap;
	//地图列表 ， TSoftObjectPtr 是软对象指针，只有在使用时才加载，用于延迟加载地图
	UPROPERTY(EditDefaultsOnly)
	TMap<FString, TSoftObjectPtr<UWorld>> Maps;
	
	//根据地图资源名称获取地图名称
	FString GetMapNameFromMapAssetName(const FString& MapAssetName) const;

	//默认玩家起始点标签
	UPROPERTY(EditDefaultsOnly)
	FName DefaultPlayerStartTag;

	//重写选择玩家开始位置函数，作用是获取玩家进入游戏的位置
	virtual AActor* ChoosePlayerStart_Implementation(AController* Player) override;
	/* 保存游戏部分 end*/
protected:
	virtual void BeginPlay() override;
};
